﻿using System;

namespace tuimg.structs
{
    using tuimg.element;

    // https://www.w3.org/TR/2003/REC-PNG-20031110
    // https://developer.aliyun.com/article/1062012
    // https://www.rfc-editor.org/rfc/rfc2083
    internal struct struct_png_IHDR
    {
        public uint length;
        public string tag;
        public uint width;
        public uint height;
        public byte color_depth;
        public byte color_type;
        public byte png_spec_compression_method; // 总为0（非0值为将来使用更好的压缩方法预留）
        public byte png_spec2_filter_method; // 总为0（非0值为将来使用更好的压缩方法预留）
        public byte not_interlaced; // 非隔行扫描
    }
    internal struct struct_png_datablock
    {
        public long pos;
        public uint length;
        public string tag;
        public uint crc;
    }
    internal struct struct_png_PLTE // 调色板数据块
    {
        public uint length;
        public string tag;
        public byte color_length;
        public TuimgColor[] colors;
    }
    internal struct struct_png_IDAT // 图像数据块
    {
        public uint length;
        public string tag;
        public byte zlib_compression;
        public byte additional_flags;

        public const byte ZLIB_FLEVEL_2 = 0x9c;
        public const byte ZLIB_FLEVEL_1 = 0xda;
        public const byte ZLIB_Deflate_32K = 0x78;
    }
    internal struct struct_png_IEND // 图像结束数据
    {
        public uint length;
        public string tag;
    }
    internal struct struct_png_sRGB // 图像结束数据
    {
        public uint length;
        public string tag;
        /**
0:Perceptual 适用于喜欢以输出色域为佳，而以色度精度为代价的图像，例如照片。

1:Relative colorimetric 用于需要颜色外观匹配（相对于输出设备白点）的图像，例如徽标。

2:Saturation 适用于希望保留饱和度但以色相和亮度为代价的图像，例如图表和图形。

3:Absolute colorimetric 用于需要保留绝对色度的图像，例如用于其他输出设备的图像预览（校样）。
         */
        public byte rendering_intent;
    }
    internal struct struct_png_gAMA
    {
        public uint length;
        public string tag;
        public uint data;
    }

    internal struct struct_png_pHYs
    {
        public uint length;
        public string tag;
        public uint x_axis;
        public uint y_axis;
        public uint unit_specifier;
    }
    
}
